package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.entrega1;

import junit.framework.Assert;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.uqbar.commons.utils.ApplicationContext;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Categoria;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Evasor;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.InfractorFrecuente;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Inhabilitado;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.externos.VerificadorDePagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCategorias;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.MailSender;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.SMSSender;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.VerificadorPagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionMail;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionSMS;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.vehiculos.Vehiculo;

public class Punto3TestCase {
	
	public Vehiculo unVehiculo;
	
	public AdministradorCategorias adCat;
	
	public Categoria evasor;
	public Categoria inhabilitado;
	public Categoria iFrecuente;
	
	public Captura unaCapturaEvasor;
	public Captura unaCapturaInhabilitado;
	public Captura unaCapturaLoca;
	
	public NotificacionMail notificacionEvasor;
	public NotificacionSMS notificacionInhabilitado;
	
	public NotificacionSMS notificacionSMSLoca;
	public NotificacionMail notificacionMailLoca;

	@Before
	public void setUp(){
		
		Zona zona1 = new Zona("Zona Roja", "1552478536");
		Zona zona2 = new Zona("Zona Verde", "1554714585");
		Image unaFotito = new Image();
		Image otraFotito = new Image();
		
		TipoInfraccion unaInfraccion = new TipoInfraccion("Cruzar en Rojo", 50, 2000);
		TipoInfraccion otraInfraccion= new TipoInfraccion("Mal estacionado", 120, 10);
		TipoInfraccion infraccionLoca = new TipoInfraccion("Esta borracho", 0, 0);
		
		unaCapturaEvasor= new Captura(zona2, unaInfraccion, otraFotito, new DateTime());
		unaCapturaInhabilitado = new Captura(zona1, otraInfraccion, unaFotito, new DateTime());
		unaCapturaLoca = new Captura(zona1, infraccionLoca, null, new DateTime());
		
		//VerificadorDePagos verificadorDePagos = new VerificadorPagos();
		ApplicationContext.getInstance().configureSingleton(VerificadorDePagos.class, new VerificadorPagos());
		
		ApplicationContext.getInstance().configureSingleton(AdministradorCategorias.class, new AdministradorCategorias());
		AdministradorCategorias adCat = ApplicationContext.getInstance().getSingleton(AdministradorCategorias.class);
		//adCat = new AdministradorCategorias();
		
		//unVehiculo = new Vehiculo("ZZZ 515", adCat, verificadorDePagos);
		unVehiculo = new Vehiculo("ZZZ 515");
		
		evasor = new Evasor();
		inhabilitado = new Inhabilitado();
		iFrecuente = new InfractorFrecuente();
		
		notificacionSMSLoca = new NotificacionSMS(new SMSSender());
		
		MailSender unMailSender = new MailSender();
		notificacionMailLoca = new NotificacionMail(unMailSender);
		notificacionMailLoca.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionMailLoca.setDireccion("teponeslagorra@policiafederal.gob.ar");
		
		infraccionLoca.addNotificacion(notificacionSMSLoca);
		infraccionLoca.addNotificacion(notificacionMailLoca);
		
		notificacionEvasor = new NotificacionMail(unMailSender);
		notificacionEvasor.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionEvasor.setDireccion("capturanus@afip.gob.ar");
		
		notificacionInhabilitado = new NotificacionSMS(new SMSSender());
		
		evasor.setNotificacion(notificacionEvasor);
		inhabilitado.setNotificacion(notificacionInhabilitado);
		
		adCat.addCategoria(evasor);
		adCat.addCategoria(inhabilitado);
		adCat.addCategoria(iFrecuente);
		
	}
	
	@Test
	public void verificarNotificacionesEvasor(){
		
		Assert.assertFalse(notificacionEvasor.fueEnviada());
		
		unVehiculo.addCaptura(unaCapturaEvasor);
		
		Assert.assertTrue(notificacionEvasor.fueEnviada());
	}
	
	@Test
	public void verificarNotificacionesInhabilitados(){

		Assert.assertFalse(notificacionInhabilitado.fueEnviada());
		
		unVehiculo.addCaptura(unaCapturaInhabilitado);

		Assert.assertTrue(notificacionInhabilitado.fueEnviada());
	}
	
	@Test
	public void verificarNotificacionesFrecuentes(){
		
		Assert.assertFalse(notificacionSMSLoca.fueEnviada());
		Assert.assertFalse(notificacionMailLoca.fueEnviada());
		
		unVehiculo.addCaptura(unaCapturaLoca);
		unVehiculo.addCaptura(unaCapturaLoca);
		unVehiculo.addCaptura(unaCapturaLoca);
		unVehiculo.addCaptura(unaCapturaLoca);
		unVehiculo.addCaptura(unaCapturaLoca);

		Assert.assertFalse(notificacionSMSLoca.fueEnviada());
		Assert.assertFalse(notificacionMailLoca.fueEnviada());
		
		unVehiculo.addCaptura(unaCapturaLoca);
		
		Assert.assertTrue(notificacionSMSLoca.fueEnviada());
		Assert.assertTrue(notificacionMailLoca.fueEnviada());
		
	}

}
